solving hard sudoku